﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.UI;
using System.Web.UI.WebControls;
using Box.BL;
using Box.Entities;
using Microsoft.Practices.Unity;

namespace Box.Cliente.Logistica.Compras
{
    public partial class frmCompras : System.Web.UI.Page
    {
        #region Declaracion de dependencias

        [Dependency]
        public ICompraBL CompraBL { get; set; }

        [Dependency]
        public IInsumoBL InsumoBL { get; set; }

        [Dependency]
        public IProveedorBL ProveedorBL { get; set; }

        [Dependency]
        public ITipoDocumentoBL TipoDocumentoBL { get; set; }

        //para guardar los pagos de las compras
        [Dependency]
        public IPagoCompraBL PagoCompraBL { get; set; }

        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var idCompra = Request.QueryString["id"];

            if (!Page.IsPostBack)
            {
                if (opc != null && opc.Equals("nuevo"))
                {
                    ViewState["opc"] = "nuevo";

                    var compra = new Compra()
                    {
                        FechaCompra=DateTime.Now

                    };

                    lblTotal1.Text = compra.Total.ToString();
                    BindingCompra(compra);
                    ViewState["opc"] = opc;
                    Cache.Insert("compra", compra);
                }
                else if (opc != null && opc == "editar" && idCompra != null)
                {
                    ViewState["opc"] = "editar";

                    var compra = CompraBL.GetFromComprasById(Int32.Parse(idCompra));
                    
                    ddlEstado.Text = compra.EstadoCompra.ToString();
                    //imagen
                    txtCodigo.Text = compra.NumDocumento;
                    ddlDocumento.SelectedValue = compra.IdTipoDocumento.ToString();
                    ddlTipoPago.SelectedValue = compra.TipoPago.ToString();

                    Cache.Insert("compra", compra);

                    BindingCompra(compra);
                }
                if (opc == "delete")
                {
                    var identificador = int.Parse(idCompra);
                    CompraBL.RemoveCompra(identificador);
                    Response.Redirect("frmListCompras.aspx");
                }
            }
            
        }

        #region Colsutas GET
        public IQueryable<Insumo> GetInsumos([Control("txtCriterio")] string criterio)
        {
            return InsumoBL.GetFromInsumosByCriterio(criterio).AsQueryable();
        }

        public IEnumerable<TipoDocumento> GetTipoDocumentos()
        {
            return TipoDocumentoBL.GetAllFromTipoDocumentos();
        } 

        #endregion

        #region Enlace compra
        private void BindingCompra(Compra compra)
        {
            hfIdCompra.Value = compra.Id.ToString();

            txtFecha.Text = compra.FechaCompra.ToShortDateString();

            if (compra.Proveedor != null)
            {
                txtRuc.Text = compra.Proveedor.RucProvedor;
                txtCliente.Text = compra.Proveedor.NombreEmpresa;
                txtDireccion.Text = compra.Proveedor.DireccionProveedor;
            }

            //para que el total sea el resultado de las suma de todos los montos
            compra.Total = compra.DetalleCompras.Sum(dp => dp.Monto);

            lvDetCompra.DataSource = compra.DetalleCompras;
            lvDetCompra.DataBind();

            if (compra.DetalleCompras.Count > 0)
            {
                var lblTotal = lvDetCompra.FindControl("lblTotal") as Label;
                lblTotal.Text = compra.Total.ToString();
               // tbxMonto.Text = compra.Total.ToString();
            }

        }
        #endregion

        #region Buscar Proveedor
        protected void btnBuscarProveedor_Click(object sender, EventArgs e)
        {
            var ruc = txtRuc.Text;

            var proveedor = ProveedorBL.GetFromProveedorByRuc(ruc);

            if (proveedor != null)
            {
                //lblMensajeCliente.Text = "";
                var compra = Cache.Get("compra") as Compra;

                compra.Proveedor = proveedor;
                compra.IdProveedor = proveedor.Id;

                BindingCompra(compra);

                Cache.Insert("compra", compra);

            }
            else
            {
                string script = "alert('El Proveedor no existe.');";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, true);
            }
        }
        #endregion

        #region Agredar y quitar insumos del detalle

        protected void lvInsumos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var insumoId = Int32.Parse(e.CommandArgument.ToString());
                var insumo = InsumoBL.GetFromInsumosById(insumoId);

                var compra = Cache.Get("compra") as Compra;

                var existe = compra.DetalleCompras.SingleOrDefault(i => i.IdInsumo.Equals(insumoId));

                if (existe == null)
                {
                    var newInsumos = new DetalleCompra()
                    {
                        Cantidad = 1,
                        Insumo = insumo,
                        IdInsumo = insumoId,
                        IdCompra = compra.Id,
                        PrecioUnit = insumo.Precio

                    };
                    compra.DetalleCompras.Add(newInsumos);
                }
                else
                {
                    existe.Cantidad += 1;
                }
                //compra.Total = compra.DetalleCompra.Sum(i => i.Monto);

                BindingCompra(compra);

                Cache.Insert("compra", compra);
            }
        }
        #region ACtulizar detalle
        protected void txtCantidad_TextChanged(object sender, EventArgs e)
        {
            try
            {
                var compra = Cache.Get("compra") as Compra;

                foreach (var row in lvDetCompra.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPRecio") as TextBox;

                    compra.DetalleCompras.ToList()[row.DisplayIndex].Cantidad = Int32.Parse(txtCantidad.Text);
                    compra.DetalleCompras.ToList()[row.DisplayIndex].PrecioUnit = Int32.Parse(txtPrecio.Text);
                }
                BindingCompra(compra);

                Cache.Insert("compra", compra);
            }
            catch (Exception)
            {

                Response.Redirect("~/RedireccionErrores/500.aspx");
            }
        }
        protected void txtPrecio_TextChanged(object sender, EventArgs e)
        {
            try
            {
                var compra = Cache.Get("compra") as Compra;

                foreach (var row in lvDetCompra.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPRecio") as TextBox;

                    compra.DetalleCompras.ToList()[row.DisplayIndex].Cantidad = Int32.Parse(txtCantidad.Text);
                    compra.DetalleCompras.ToList()[row.DisplayIndex].PrecioUnit = Int32.Parse(txtPrecio.Text);
                }
                BindingCompra(compra);

                Cache.Insert("compra", compra);
            }
            catch (Exception)
            {
                Response.Redirect("~/RedireccionErrores/500.aspx");
            }

            
        }
        #endregion
        protected void lvDetCompra_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var insumoId = Int32.Parse(e.CommandArgument.ToString());

                var compra = Cache.Get("compra") as Compra;

                //item es un insumo agrgado al detalle
                var item = compra.DetalleCompras.SingleOrDefault(i => i.IdInsumo.Equals(insumoId));

                if (item != null)
                {
                    //verificamos que si la cantidad del item en el detalle es == 1
                    //si es verdadero borrara el item del detalle
                    if (item.Cantidad == 1)
                    {
                        compra.DetalleCompras.Remove(item);
                    }
                    //si la condicion del if es falsa, entonces solo disminuira la cantidad del item
                    item.Cantidad -= 1;
                }

                BindingCompra(compra);

                Cache.Insert("compra", compra);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var compra = Cache.Get("compra") as Compra;

                foreach (var row in lvDetCompra.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPRecio") as TextBox;

                    compra.DetalleCompras.ToList()[row.DisplayIndex].Cantidad = Int32.Parse(txtCantidad.Text);
                    compra.DetalleCompras.ToList()[row.DisplayIndex].PrecioUnit = Int32.Parse(txtPrecio.Text);
                }
                BindingCompra(compra);

                Cache.Insert("compra", compra);
            }
        }

        #endregion

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var compra = Cache.Get("compra") as Compra;

            if (compra!=null)
            {

                
                compra.IdTipoDocumento = Int32.Parse(ddlDocumento.SelectedValue.ToString());

                compra.NumDocumento = txtCodigo.Text;
                compra.EstadoCompra = ddlEstado.Text;
                #region Seleccionar Archivo

                #endregion
                compra.FechaCompra = DateTime.Parse(txtFecha.Text);
                compra.TipoPago = ddlTipoPago.SelectedValue;

                if (ViewState["opc"].ToString() == "nuevo")
                {
                    if (txtCliente.Text == "" && txtRuc.Text == "")
                    {
                        ScriptManager.
                              RegisterClientScriptBlock(this,
                              this.GetType(), "alertMessage", "alert('Falta ingresar datos de proveedor')", true);

                    }
                    else {

                        CompraBL.AddCompra(compra);

                        #region Agrgar los Pagos
                        foreach (var row in lvCuotas.Items)
                        {
                            var tbxMonto = row.FindControl("tbxMonto") as TextBox;
                            var tbxFecha = row.FindControl("tbxFechPago") as TextBox;
                            var tbxEstado = row.FindControl("tbxEstado") as TextBox;

                            var cuota = new PagoCompra()
                            {
                                MontoPagar = decimal.Parse(tbxMonto.Text),
                                FechaPagoCuota = DateTime.Parse(tbxFecha.Text),
                                Estado = tbxEstado.Text,

                                CompraId = compra.Id
                            };

                            PagoCompraBL.AddPagoCompra(cuota);
                        }
                        #endregion

                        Response.Redirect("frmListCompras.aspx");
                    }

                }
                else if (ViewState["opc"].ToString() == "editar")
                {
                   CompraBL.UpdateCompra(compra);

                    Response.Redirect("frmListCompras.aspx");

                }
            }
        }

        #region Pagos
        protected void btnAgregar_Click(object sender, EventArgs e)
        {

            var compra = Cache.Get("compra") as Compra;
            //convertimos la cantidas a un int
            var monto = compra.Total;
            var cantidad = Int32.Parse(tbxCantidad.Text);
            var fecha = DateTime.Parse(txtFecha.Text);   

            //monto que se va a pagar por fecha segun el numero de cuotas
            var aPagar = decimal.Round(monto/cantidad,2);

            //para poder usar el id del objeto Compra

            var idCompra = compra.Id;


            //var rv = new List<DateTime>();

            //DateTime tmpDate = fecha;
            //for (int i = 0; i < cantidad; i++)
            //{
            //    rv.Add(tmpDate);
            //    tmpDate = tmpDate.AddDays(7);
            //}

            

            var lista = new List<PagoCompra>();

            for (Int32 i = 0; i < cantidad; i++ )
            {
                var fechita = CalcularFechas(fecha);

                var item = new PagoCompra()
                {
                    CompraId = idCompra,
                    MontoPagar = aPagar,
                    FechaPagoCuota = fechita
                };
                lista.Add(item);

                fecha = fechita;
            }

            lvCuotas.DataSource = lista;
            lvCuotas.DataBind();
        }

        private DateTime CalcularFechas(DateTime fecha)
        {
            //var cantidad = Int32.Parse(tbxCantidad.Text);
            //var rv = new List<DateTime>();

            //DateTime tmpDate = fecha;

            //for (int i = 0; i < cantidad; i++)
            //{
            //    rv.Add(tmpDate);
            //    tmpDate = tmpDate.AddDays(7);
            //}

            //return tmpDate;

            if (ddlFechPagos.SelectedValue=="Semanal")
            {
                fecha = fecha.AddDays(7);
            }
            else if (ddlFechPagos.SelectedValue == "Quincenal")
            {
                fecha = fecha.AddDays(15);
            }
            else
            {
                fecha = fecha.AddDays(30);
            }

            return fecha;

        }
        #endregion

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("frmListCompras.aspx");
        }

    }
}